import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# pandas绘图
"""
-- Series和DataFrame都有一个用于生成各类图标的plot()方法。
-- pandas的绘图是基于matplotlib的，因此我们需要先导入matplotlib.pyplot模块。
-- 常见的可视化图像：
    - line plot：折线图
    - bar plot：条形图
    - scatter plot：散点图
    - histogram：直方图
    - box plot：箱线图
    - pie chart：饼图  
"""

# 1.折线图
# 1.1 Series图标
print("1.1 Series图标")
s = pd.Series([100, 600, 300, 400, 500, 400, 700, 100])
# print(s)
# s.plot()
plt.show()

# sin曲线
x = np.arange(0, 2 * np.pi, 0.1)
# print(x)

y = np.sin(x)
ss = pd.Series(data=y, index=x)
# print(ss)
# ss.plot()
plt.show()

# 1.2 DataFrame图标
# -- 图例的位置可能会随着数据的不同而不同
print("\n1.2 DataFrame图标")
data = np.random.randint(0, 100, size=(5, 6))
index = list('ABCDE')
columns = ['罗峰', '李杰', '王晓东', '张三', '李四', '王五']
df = pd.DataFrame(data, index=index, columns=columns)
print(df)
# 每一列一根线
# df.plot()
plt.show()
# 每一行一根线
# df.T.plot()
plt.show()
# 每一列一根线，每一行一根线


# 2.条形图和柱状图
print("\n2.条形图和柱状图")
# 2.1 Series柱状图，kind='bar/barh'
print("\n2.1 Series柱状图，kind='bar/barh'")

df1 = pd.DataFrame(np.random.rand(10, 4))
# 第一种方式
# df1.plot(kind='bar')
# 第二种方式
# df1.plot.bar()
# 是否堆叠
df1.plot.bar(stacked=True)
plt.show()

sss = pd.Series(data=[600, 300, 400, 400, 700, 100], index=['A', 'B', 'C', 'D', 'E', 'F'])
# sss.
# print(sss)
# sss.plot(kind='bar')  # 默认是竖着的
sss.plot(kind='barh')  # 横着的
plt.show()

# 2.2 DataFrame柱状图
print("\n2.2 DataFrame柱状图")
data = np.random.randint(0, 100, size=(4, 3))
index = list('ABCD')
columns = ['apple', 'banana', 'orange']
df = pd.DataFrame(data, index=index, columns=columns)
print(df)
# df.plot(kind='bar')  # 默认是竖着的
df.plot(kind='barh')  # 默认是横着的
plt.show()

# 3.直方图
print("\n3.直方图")
"""
rondom生成随机数百分比直方图，调用hist方法
-- 柱高表示数据的频数，柱宽表示各组数据的组距
-- 参数bins可以设置直方图方柱的个数上限，越大柱宽越小，数据分组越细致
-- 设置density参数为True，可以将频数转换为概率密度
"""
ssss = pd.Series([1, 2, 1, 2, 1, 5, 4, 6, 3, 2, 1, 5, 4, 5, 3, 2, 4, 4])
ssss.plot(kind='hist', bins=5, density=True)  # bins表示直方图的柱数，density表示是否显示频数或概率密度
plt.show()

# ked图：核密度估计图，用于弥补直方图由于参数bins设置的不合理导致的精度缺失问题
print("\n.核密度估计图")
ssss1 = pd.Series([1, 2, 1, 2, 1, 5, 4, 6, 3, 2, 1, 5, 4, 5, 3, 2, 4, 4])
ssss1.plot(kind='hist', bins=5, density=True)  # bins表示直方图的柱数，density表示是否显示频数或概率密度
ssss1.plot(kind='kde')  # 核密度估计图
plt.show()

# 4.饼图
print("\n4.饼图")
df9 = pd.DataFrame(
    data=np.random.rand(4, 2),
    index=list('ABCD'),
    columns=['apple', 'banana']
)
print(df9)
# 画饼图
# df9['apple'].plot(kind='pie', autopct='%1.1f%%')  # autopct表示百分比格式
plt.show()

# 画多个饼图，subplots=True表示画多个子图，figsize表示子图大小
df9.plot.pie(subplots=True, figsize=(8, 8), autopct='%1.1f%%')  # 画多个饼图
plt.show()

# 5.散点图
print("\n5.散点图")
# -- 散点图是观察两个一维数据列之间的关系的有效方法，DataFrame对象可用

data = np.random.normal(size=(1000, 2))
df8 = pd.DataFrame(data, columns=['A', 'B'])
print(df8.head())
# x=‘A’：使用A列的数据作为x轴坐标，y=‘B’：使用B列的数据作为y轴坐标
# 第一种方式
# df8.plot(kind='scatter', x='A', y='B')
# 第二种方式
df8.plot.scatter(x='A', y='B')
plt.show()

# 6.面积图
print("\n6.面积图")
df7 = pd.DataFrame(data=np.random.rand(10, 4), columns=list('ABCD'))
# df7.plot(kind='area')
df7.plot.area(stacked=True) # stacked=True表示堆叠面积图

plt.show()

# 7.箱线图
print("\n7.箱线图")
df6 = pd.DataFrame(data=np.random.rand(10, 4), columns=list('ABCD'))
# df6.plot(kind='box')
df6.plot.box()
plt.show()
"""
最大值
75%
50%
25%
最小值
圆点：表示异常值，离群点

"""

